#include <iostream>
#include <thread>
#include <vector>

int main()
{
    auto func = []()
    {
        std::this_thread::sleep_for(std::chrono::seconds(1)); // 长时间运行
    };

    //  创建线程 t1，并立即获得所有权
    std::thread t1{func};

    // 转移所有权，移动后 t1不再拥有任何线程，线程本身继续执行
    std::thread t2 = std::move(t1);
    std::thread t3{func};

    if (t2.joinable())
    { // 转移所有权的时候要确保被转移的对象不执行任何任务
        t2.join();
        t2 = std::move(t3);
    }
    t2.join();

    std::vector<std::thread> vecWorker{};
    for (int i = 0; i < 5; ++i)
    {
        vecWorker.emplace_back(func); // 传递构造参数在内部进行构造
    }
    for (auto & worker : vecWorker)
    {
        if (worker.joinable())
        {
            worker.join();
        }
    }

    auto funCreateThread = []()
    {
        return std::thread{[]()
        {
            std::cout << "Id:" << std::this_thread::get_id() << std::endl;
            std::this_thread::sleep_for(std::chrono::seconds(1));
        }}; // 创建并返回一个局部对象并触发移动语义
    };

    std::thread t4 = funCreateThread();

    auto Thread = [](std::thread t)
    {
        if (t.joinable())
        {
            t.join();
        }
    };

    Thread(std::move(t4)); // t4 不再拥有线程

    return 0;
}
